package com.bocai.kelalacar.net;



import com.bocai.kelalacar.base.BaseResponse;
import com.bocai.kelalacar.bean.ChangePhoneBean;
import com.bocai.kelalacar.bean.OptionalSeatsBean;
import com.bocai.kelalacar.bean.PutDriverBean;
import com.bocai.kelalacar.net.Url;

import java.util.List;
import java.util.Map;

import okhttp3.MultipartBody;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.PATCH;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import rx.Observable;


/**
 * 作者 yuanfei on 2017/2/17.
 * 邮箱 yuanfei221@126.com
 */

public interface Api {

    @FormUrlEncoded
    @POST(Url.SENDCODE)
    Observable<BaseResponse> sendCode(@Field("PhoneNumber") String PhoneNumber, @Field("RequestType") String RequestType);

    /**
     * 获取手机号状态
     * @param phoneNumber
     * @return
     */
    @GET(Url.PHONETYPE)
    Observable<BaseResponse> phoneType(@Path("phoneNumber") String phoneNumber,@Query("mtype") String mtype);


    /**
     * 会员注册
     * @param PhoneNumber 手机号
     * @param Password  密码
     * @param SmsVerifyCode 短信验证码
     * @param MemberType  会员类型 【1-旅行社】【2-车队】【3-司机】
     * @return
     */
    @FormUrlEncoded
    @POST(Url.REGISTER)
    Observable<BaseResponse> register(@Field("PhoneNumber") String PhoneNumber, @Field("Password") String Password,
                                      @Field("SmsVerifyCode") String SmsVerifyCode, @Field("MemberType") int MemberType,@Field("MobileDevice") String MobileDevice);

    /**
     * 会员登陆
     * @param PhoneNumber
     * @param Password
     * @param MobileDevice 设备编号，使用极光推送的话，使用极光推送的RegistrationId
     * @return
     */
    @FormUrlEncoded
    @POST(Url.LOGIN)
    Observable<BaseResponse> login(@Field("PhoneNumber") String PhoneNumber, @Field("Password") String Password,
                                   @Field("MobileDevice") String MobileDevice,@Field("MemberType") String MemberType);

    /**
     * 找回/重置/设置密码
     * @param PhoneNumber
     * @param Password
     * @param SmsVerifyCode
     * @return
     */
    @FormUrlEncoded
    @PATCH(Url.RESETPW)
    Observable<BaseResponse> resetPw( @Field("PhoneNumber") String PhoneNumber, @Field("Password") String Password, @Field("SmsVerifyCode") String SmsVerifyCode,@Field("MemberType") String MemberType);

    /**
     * 修改手机号
     * @param ID 会员ID
     * @return
     */
    @Headers({"Content-Type: application/json;charset=UTF-8"})
    @PATCH(Url.CHANGEPHONE)
    Observable<BaseResponse> changePhone(@Path("ID") String ID, @Body ChangePhoneBean bean);

    /**
     * 图片上传
     * @param parts
     * @return
     */
    @Multipart
    @POST(Url.UPLOADIMG)
    Observable<BaseResponse> uploadImage( @Part List<MultipartBody.Part> parts);


    /**
     * 更新会员头像
     * @param memberId
     * @param AvatarId
     * @return
     */
    @FormUrlEncoded
    @PATCH(Url.AVATARUPLOADIMG)
    Observable<BaseResponse> avatarImg( @Path("memberId") String memberId, @Field("AvatarId") String AvatarId);

    /**
     * 旅行社提交认证信息
     * @param CompanyName 公司名称
     * @param ContactName 联系人
     * @param IdNumber 身份证
     * @param LicenseId 营业执照图片Id
     * @return
     */
    @FormUrlEncoded
    @POST(Url.PUTTRAVELINFOR)
    Observable<BaseResponse> travelInfor(@Path("memberId") String memberId,@Field("CompanyName") String CompanyName, @Field("ContactName") String ContactName,
                                         @Field("IdNumber") String IdNumber, @Field("LicenseId") String LicenseId);

    /**
     * 获取会员认证信息
     * @param memberId
     * @return
     */
    @GET(Url.GETTRAVELINFOR)
    Observable<BaseResponse> getTravelInfor(@Path("memberId") String memberId);

    /**
     * 退出登录
     * @return
     */
    @POST(Url.LOGOUT)
    Observable<BaseResponse> logOut();



    @Headers({"Content-Type: application/json;charset=UTF-8"})
    @POST(Url.PUTDRIVERINFOR)
    Observable<BaseResponse> putDriverInfor(@Path("memberId") String memberId, @Body PutDriverBean bean);


    /**
     * 可选择车辆座位数
     * @return
     */
    @GET(Url.OPTIONALSEATS)
    Observable<OptionalSeatsBean> optionalSeats();

    /**
     * 车队提交认证信息
     * @param memberId
     * @param TeamName 车队名称
     * @param ContactName 联系人
     * @param IdNumber 身份证号
     * @param LicenseId 营业执照
     * @param TransportLicenseId 道路运输许可证
     * @return
     */
    @FormUrlEncoded
    @POST(Url.PUTTEAMINFOR)
    Observable<BaseResponse> teamInfor(@Path("memberId") String memberId,@Field("TeamName") String TeamName, @Field("ContactName") String ContactName,
                                         @Field("IdNumber") String IdNumber, @Field("LicenseId") String LicenseId,@Field("TransportLicenseId") String TransportLicenseId);

    /**
     * 车队添加车辆
     * @param memberId
     * @param CarLicense 车牌
     * @param BuyTime 购买时间
     * @param Seats 荷载人数
     * @param CarImageIds 车辆图片Id【多个,分割】
     * @return
     */
    @FormUrlEncoded
    @POST(Url.ADDCAR)
    Observable<BaseResponse> addCar(@Path("memberId") String memberId,@Field("CarLicense") String CarLicense, @Field("BuyTime") String BuyTime,
                                       @Field("Seats") String Seats, @Field("CarImageIds") String CarImageIds);

    /**
     * 车队添加司机
     * @param memberId
     * @param DriverName 司机姓名
     * @param DriverPhone 司机手机
     * @return
     */
    @FormUrlEncoded
    @POST(Url.ADDDRIVER)
    Observable<BaseResponse> addDriver(@Path("memberId") String memberId,@Field("DriverName") String DriverName, @Field("DriverPhone") String DriverPhone);

    /**
     *
     * @return
     */
    @GET(Url.GETCARANDDRIVER)
    Observable<BaseResponse> getCarDriverList(@Path("memberId") String memberId);

    /**
     * 车队删除司机
     * @param driverId
     * @return
     */
    @DELETE(Url.DETELEDRIVER)
    Observable<BaseResponse> deleteDriver(@Path("driverId") String driverId);

    /**
     * 车队删除车辆
     * @param carId
     * @return
     */
    @DELETE(Url.DETELECAR)
    Observable<BaseResponse> deleteCar(@Path("carId") String carId);

    /**
     * 车队修改车辆
     * @param carId
     * @return
     */
    @FormUrlEncoded
    @PUT(Url.MODIFYCAR)
    Observable<BaseResponse> modifyCar(@Path("carId") String carId,@Field("CarLicense") String CarLicense, @Field("BuyTime") String BuyTime,
                                       @Field("Seats") String Seats, @Field("CarImageIds") String CarImageIds);

    /**
     * 车队修改车辆
     * @param carId
     * @return
     */
    @FormUrlEncoded
    @PUT(Url.MODTFYDRIVER)
    Observable<BaseResponse> modifyDriver(@Path("driverId") String driverId,@Field("DriverName") String DriverName, @Field("DriverPhone") String DriverPhone);

    /**
     * 司机发布行程
     * @param PriceId 路线价格Id
     * @param DepartureTime 出发开始时间
     * @param Deadline 出发截止时间
     * @return
     */
    @FormUrlEncoded
    @POST(Url.DRIVERPUBLISH)
    Observable<BaseResponse> driverPublish(@Field("PriceId") String PriceId, @Field("DepartureTime") String DepartureTime,
                                           @Field("Deadline") String Deadline);

    /**
     * 查询路线是否在运营范围
     * @param originCity 始发城市Id
     * @param arrivalCity 目的城市Id
     * @return
     */
    @GET(Url.PRICELIST)
    Observable<BaseResponse> checkLine(@Query("addressId") String addressId);

    /**
     *
     * @return
     */
    @POST(Url.BAILORDER)
    Observable<BaseResponse> bailOrder();


    /**
     * 订单支付【测试用】
     * @param orderId
     * @return
     */
    @PATCH(Url.ORDERPAY)
    Observable<BaseResponse> orderPay( @Path("orderId") String orderId);

    /**
     * 车队发布行程
     * @param PriceId 路线价格Id
     * @param CarId 车辆Id
     * @param DriverId 司机Id
     * @param DepartureTime 出发开始时间
     * @param Deadline 出发截止时间
     * @return
     */
    @FormUrlEncoded
    @POST(Url.PUBLISHTEAM)
    Observable<BaseResponse> teamPublish(@Field("PriceId") String PriceId,@Field("CarId") String CarId,
                                         @Field("DriverId") String DriverId,@Field("DepartureTime") String DepartureTime,
                                           @Field("Deadline") String Deadline);

    /**
     * 我的钱包
     * @return
     */
    @GET(Url.MYWALLET)
    Observable<BaseResponse> myWallet();

    /**
     * 钱包现金流水
     * @param pageNo
     * @param limit
     * @return
     */
    @GET(Url.MYWALLETBILL)
    Observable<BaseResponse> myWalletBill(@Query("pageNo") String pageNo,@Query("limit") String limit);

    /**
     * 提现方式列表
     * @return
     */
    @GET(Url.APPLYWAYS)
    Observable<BaseResponse> applyWay();

    /**
     * 新增提现方式
     * @param OpenBank  开户行【银行卡必填】
     * @param PaymentType 提现类型【0-银行卡】【1-支付宝】【2-微信】
     * @param RealName 持卡人
     * @param Account 账号
     * @return
     */
    @FormUrlEncoded
    @POST(Url.ADDAPPLYWAYS)
    Observable<BaseResponse> addApplyWay(@Field("OpenBank") String OpenBank,@Field("PaymentType") String PaymentType,
                                         @Field("RealName") String RealName,@Field("Account") String Account);

    /**
     * 删除提现方式
     * @param wayId
     * @return
     */
    @DELETE(Url.DELETEAPPLYWAY)
    Observable<BaseResponse> deleteApplyWay(@Path("wayId") String wayId);

    /**
     * 提现申请
     * @param WayId 提现方式Id
     * @param Money 金额
     * @param IsBail 是否保证金
     * @return
     */
    @FormUrlEncoded
    @POST(Url.WALLETAPPLY)
    Observable<BaseResponse> walletApply(@Field("WayId") String WayId,@Field("Money") String Money,
                                         @Field("IsBail") boolean IsBail);

    /**
     *首页行程列表
     * @param pageIndex 页码【默认1】
     * @param pageSize 页大小【默认10】
     * @param time 用车时间
     * @param seats 座位数
     * @param originCity 始发城市名称
     * @param arriveCity 目的城市名称
     * @return
     */
    @GET(Url.MAINLIST)
    Observable<BaseResponse> homeList(@Query("pageIndex") String pageIndex,@Query("pageSize") String pageSize,
                                      @Query("time") String time,@Query("seats") String seats,
                                      @Query("originCity") String originCity,@Query("arriveCity") String arriveCity);

    /**
     * 旅行社出行详情
     * @param orderId
     * @return
     */
    @GET(Url.TRAVELINFO)
    Observable<BaseResponse> getTravelInfo(@Path("orderId") String orderId);


    /**
     * 抢单
     * @param orderId
     * @return
     */
    @POST(Url.GRADORDER)
    Observable<BaseResponse> grabOrder(@Path("orderId") String orderId);

    /**
     * 我发布的行程
     * @param pageIndex 页码【默认1】
     * @param pageSize 页大小【默认10】
     * @return
     */
    @GET(Url.MYPUBLISHSTROKE)
    Observable<BaseResponse> myStrokePublish(@Query("pageIndex") String pageIndex,@Query("pageSize") String pageSize);

    /**
     * 我的抢单
     * @param pageIndex
     * @param pageSize
     * @return
     */
    @GET(Url.MYGRADORDER)
    Observable<BaseResponse> myGrabOrder(@Query("pageIndex") String pageIndex,@Query("pageSize") String pageSize);

    /**
     * 订单详情
     * @param orderId
     * @return
     */
    @GET(Url.ORDERDETAIL)
    Observable<BaseResponse> orderDetail(@Path("orderId") String orderId);

    /**
     * 车队派车/车队变更车辆和司机
     * @param orderId
     * @return
     */
    @FormUrlEncoded
    @PATCH(Url.TEAMARRANGE)
    Observable<BaseResponse> teamArrange( @Path("orderId") String orderId,@Field("CarId") String CarId,@Field("DriverId") String DriverId);

    /**
     * 开始行程
     * @param orderId
     * @return
     */
    @PATCH(Url.STARTSTROKE)
    Observable<BaseResponse> startStroke( @Path("orderId") String orderId);

    /**
     * 取消行程
     * @param orderId
     * @return
     */
    @PATCH(Url.CANCLEORDER)
    Observable<BaseResponse> cancleOrder( @Path("orderId") String orderId);

    /**
     * 完成行程
     * @param orderId
     * @return
     */
    @PATCH(Url.FINISHORDER)
    Observable<BaseResponse> finishOrder( @Path("orderId") String orderId);

    /**
     * 消息列表【分页】
     * @param pageIndex 页码【默认1】
     * @param pageSize 页大小【默认10】
     * @return
     */
    @GET(Url.MESSAGELIST)
    Observable<BaseResponse> messageList(@Query("pageIndex") String pageIndex,@Query("pageSize") String pageSize);

    /**
     * 消息设为已读
     * @param messageId
     * @return
     */
    @PATCH(Url.READMESSAGE)
    Observable<BaseResponse> readMessage( @Path("messageId") String messageId);

    /**
     * 删除消息
     * @param messageId
     * @return
     */
    @DELETE(Url.DELETEMESSAGE)
    Observable<BaseResponse> deleteMessage(@Path("messageId") String messageId);

    /**
     * 获取会员信息
     * @return
     */
    @GET(Url.GETUSER)
    Observable<BaseResponse> getUser();

    /**
     * 单页内容
     * @param key  01 【客拉拉用车服务协议】 02【关于客拉拉】
     * @return
     */
    @GET(Url.WEBVIEWPAGE)
    Observable<BaseResponse> webViewPage(@Path("key") String key);

    /**
     *
     * @param paymentCode
     * @param orderId
     * @return
     */
    @POST(Url.PAYTYPE)
    Observable<BaseResponse> payType(@Path("paymentCode") String paymentCode, @Path("orderId") String orderId);

    /**
     * 出发地列表
     * @return
     */
    @GET(Url.ORIGINAREAS)
    Observable<BaseResponse> originAreas();

    /**
     * 目的地列表
     * @param originCityId 出发地市Id
     * @param originAddress 出发地详细地址
     * @return
     */
    @GET(Url.ARRIVEAREAS)
    Observable<BaseResponse> arriveAreas(@Query("originCityId") String originCityId,@Query("originAddress") String originAddress);

    /**
     * 获取已修改地址详情
     * @param orderId
     * @return
     */

    @GET(Url.CHANGEADDRESS)
    Observable<BaseResponse> changeAddress(@Path("orderId") String orderId);

    /**
     * 不同意行程修改
     * @param orderId
     * @return
     */
    @PATCH(Url.DISAGREECHANGE)
    Observable<BaseResponse> disAgreeChange(@Path("orderId") String orderId);

    /**
     * 同意行程修改
     * @param orderId
     * @return
     */
    @PATCH(Url.AGREECHANGE)
    Observable<BaseResponse> agreeChange(@Path("orderId") String orderId);

    /**
     * 客服电话和保证金
     * @return
     */
    @GET(Url.CONFIG)
    Observable<BaseResponse> config();




}
